import torch

# 假设模型输出
outputs = torch.tensor([
    [2.1, 0.5, -1.2, 1.8, 0.3],  # 样本1
    [-0.5, 3.2, 1.1, 0.9, 2.5],  # 样本2
    [1.2, 0.8, 0.5, -0.3, 4.1]  # 样本3
], requires_grad=True)  # 假设这个张量需要梯度

print(f"原始outputs: {outputs}")
print(f"requires_grad: {outputs.requires_grad}")  # True

# outputs.data 获取不含梯度信息的纯数据
pure_data = outputs.data
print(f"outputs.data: {pure_data}")
print(f"requires_grad: {pure_data.requires_grad}")  # False

# 创建一个示例张量
outputs = torch.tensor([
    [2.1, 0.5, -1.2, 1.8, 0.3],  # 样本1
    [-0.5, 3.2, 1.1, 0.9, 2.5],  # 样本2
    [1.2, 0.8, 0.5, -0.3, 4.1]  # 样本3
])

print(f"输出张量形状: {outputs.shape}")  # torch.Size([3, 5])

# torch.max返回两个值：最大值和对应的索引
max_values, max_indices = torch.max(outputs, dim=1)

print("=== 详细计算过程 ===")
for i in range(3):
    print(f"样本{i}: {outputs[i]}")
    print(f"  最大值: {max_values[i].item():.1f}, 索引: {max_indices[i].item()}")

print(f"\n所有最大值: {max_values}")  # tensor([2.1000, 3.2000, 4.1000])
print(f"所有最大索引: {max_indices}")  # tensor([0, 1, 4])

# 完整的返回值
all_max_values, all_max_indices = torch.max(outputs, dim=1)
print(f"最大值: {all_max_values}")
print(f"索引: {all_max_indices}")

# 如果我们只关心索引（预测类别），不关心具体数值
_, predicted_classes = torch.max(outputs, dim=1)
print(f"只获取索引: {predicted_classes}")

# 下划线 _ 是Python约定，表示"这个值我不关心"
